#ifndef PLATEAU_H
#define PLATEAU_H
#define DIMENSION_PLATEAU 15
#define NB_LETTRES 27
#define NB_JOUEUR_MAX 4
#define TAILLE_CHEVALET 7

#include <stdlib.h>
#include <stdio.h>
#include <iostream>

 using namespace std;

class Cell
{
private:
    char statutCell;
    char valeurCell;

public:
    Cell();
    char getStatutCell();
    char getValeurCell();
    void setStatutCell(char statut);
    void setValeurCell(char valeur);
};

class Lettre
{
private:
    char caractere;
    int effectif;
    int valeur;

public:
    Lettre();
    Lettre(char c,int newEffectif,int newValeur);
    char getCaractere();
    int getValeur();
    int getEffectif();
    void setEffectif(int newEff);
};

class Joueur
{
private:
    string nomJoueur;
    char chevaletJoueur[TAILLE_CHEVALET];
    int scoreJoueur;

public:
    Joueur();
    Joueur(string nom);
    void reinitScoreJoueur();
    int getScoreJoueur();
    char getCaractereChevalet(int i);
    string getNomJoueur();
    void setCaractereChevalet(char c,int i);
    void affichageChevaletJoueur();
    void ajoutPointScoreJoueur(int scoreSupp);
    void setNomJoueur(string nomNouveau);
};

class Partie
{

private:
    Cell grillePlateau[DIMENSION_PLATEAU][DIMENSION_PLATEAU];
    Lettre *tabLettre[NB_LETTRES];
    Joueur *listeJoueur[NB_JOUEUR_MAX];
    int nbJoueur;
    int nbTour;
public:
    Partie();
    void affichagePlateau();
    void affichageChevaletPartie(int nJoueur);
    char getStatutCellGrille(int i, int j);
    int calculScore(int x, int y, string sens);
    int getValeurCellGrille(int i, int j);
    string getNomJoueurPartie(int num);
    int getNbJoueur();
    int getScoreJoueurPartie(int num);
    int getNbTour();
    void setValeurCellGrille(char valeur,int i, int j);
    void setNbJoueur(int n);
    void ajoutPointsScore(int numJoueur,int scoreSupp);
    void increNbTour();
    bool insertionMotPlateau(string mot, int x, int y,char sens);
    bool lettreEstDispo(char c);
    bool encoreDesLettres();
    void remplirChevalet(int num);
    void suppCaractereChevalet(int nJoueur,int nCaractere);
    void diminuerEffectifLettre(char c);
    void ajoutJoueurPartie(string nomJoueur);

};

void remplirTabLettres(Lettre *tab[NB_LETTRES]);
void init_Jeu();
bool chaineEstValide(string chaine);
bool positionEstValide(int x,int y,string mot,string sens);
string lireEntreeClavierChaine();
int lireEntreeClavierEntier();
char randomLettre();
char normaliserCara(char c);

#endif
